// 路由鉴权：项目当中的路由能不能被权限设置 (路由能否访问)
import router from './router'
// 切换路由时的进度条
import nprogress from 'nprogress'
// 引入进度条样式
import 'nprogress/nprogress.css'
// 获取用户相关的 token 数据
import useUserStore from './store/modules/user'
// 后端返回的路由相关
import usePermissionRouter from './store/modules/permissionRouter'
import type { RouteRecordRaw } from 'vue-router'

import pinia from './store'
// 标题
import setting from './setting'

import { isPathMatch } from '@/utils/validate'

// 去除进度条加载圆圈
nprogress.configure({ showSpinner: false })

const userStore = useUserStore(pinia)

const permissionRouter = usePermissionRouter(pinia)

const whiteList = ['/login']

const isWhiteList = (path) => {
  return whiteList.some(pattern => isPathMatch(pattern, path))
}

router.beforeEach((to, from, next) => {
  nprogress.start()
  if (userStore.getUserName) {
    document.title = `${setting.title} - ${to.meta.title}`
    if (to.path === '/login') {
      next({ path: '/' })
      nprogress.done()
    } else if (isWhiteList(to.path)) {
      next()
    } else {
      if (userStore.roles.length === 0) {
        userStore.userInfo().then(() => {
          permissionRouter.GenerateRoutes().then(accessRoutes => {
            // 根据roles权限生成可访问的路由表
            const arrayList = accessRoutes as Array<RouteRecordRaw>
            arrayList.forEach(item => {
              router.addRoute(item)
            });
            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
          })
        })
      } else {
        next()
      }
    }
  } else {
    // 没有token
    if (isWhiteList(to.path)) {
      // 在免登录白名单，直接进入
      next()
    } else {
      next(`/login?redirect=${encodeURIComponent(to.fullPath)}`) // 否则全部重定向到登录页
      nprogress.done()
    }
  }
})

// 路由守卫：项目当中任意路由的切换都会触发 的钩子
// 全局前置守卫
// router.beforeEach((to, from, next) => {
//   console.log(to)

//   document.title = `${setting.title} - ${to.meta.title}`
//   // to: 将要访问的路由
//   // from： 从哪个路由来
//   // next: 放行
//   nprogress.start()
//   // 获取 token 判断用户是否登录
//   // const token = userStore.token
//   const userNmae = userStore.getUserName
//   // if (token) {
//   //   if (to.path === '/login') {
//   //     next({ path: '/' })
//   //   } else {
//   //     next()
//   //   }
//   // } else {
//   //   userStore.userLogout()
//   //   // next({ path: '/login', query: { redirect: to.path } })
//   //   next()
//   // }
//   if (userNmae) {
//     next()
//   } else {
//     next()
//     // next({
//     //   path: '/login',
//     //   query: Object.assign({ redirect: to.path }, to.query),
//     // })
//   }
// })

// 全局后置守卫
router.afterEach((to, from) => {
  nprogress.done()
})
